package com.zhugang.week03;

import java.util.Stack;

/**
 * @program algorithms
 * @description: stack2Queue： 用栈实现队列
 * @author: chanzhugang
 * @create: 2022/06/03 21:50
 */
public class Stack2Queue {


    /**
     * <p>
     */
    private final Stack<Integer> stack = new Stack<>();
    private final Stack<Integer> tempStack = new Stack<>();

    /**
     * 入队
     *
     * @param data
     */
    public void enqueue1(Integer data) {
        stack.push(data);
    }

    /**
     * 解法1：入队直接入栈，出队倒腾两个栈(栈A中元素全部出栈到栈B,弹出栈B栈顶元素，栈B中其他元素全部出栈到栈A)：画图看更直观
     * A -> B
     * B栈顶元素出栈
     * B -> A
     * <p>
     * 出队
     *
     * @return
     */
    public Integer dequeue1() {
        if (stack.isEmpty()) {
            return null;
        }
        while (!stack.isEmpty()) {
            tempStack.push(stack.pop());
        }
        // 出队的数据
        Integer data = tempStack.pop();
        while (!tempStack.isEmpty()) {
            stack.push(tempStack.pop());
        }
        return data;
    }

    /**
     * 解法2：入队倒腾两个栈（栈A中所有数据压入栈B,新数据压入栈A,栈B数据全部压回栈A），出队直接出
     * A -> B
     * 元素压入A
     * B -> A
     * <p>
     * 入队
     *
     * @param data
     */
    public void enqueue2(Integer data) {
        while (!stack.isEmpty()) {
            tempStack.push(stack.pop());
        }
        stack.push(data);
        while (!tempStack.isEmpty()) {
            stack.push(tempStack.pop());
        }
    }

    public Integer dequeue2() {
        if (stack.isEmpty()) {
            return null;
        }
        return stack.pop();
    }
}